// HTTP拦截器
import axios, { AxiosResponse, AxiosError } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import router from '../router'
const env = import.meta.env

// 开发环境使用配置文件 .env.development
if (env.MODE === 'development') {
  window.IPCONFIG = env.VITE_IPCONFIG
}
axios.defaults.baseURL = window.IPCONFIG
// java包引用打开
// if (env.MODE === 'production') {
//   axios.defaults.baseURL = location.origin
// }
// 创建axios实例
const instance = axios.create({
  // // 是否跨站点访问控制请求
  // withCredentials: true,
  timeout: 1000 * 60,
})
// 设置post请求头
// instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

// 请求前拦截
instance.interceptors.request.use(
  (config) => {
    // 获取token，并将其添加至请求头中
    const token = window.sessionStorage.getItem('token')
    const store = JSON.parse(window.sessionStorage.getItem('main') as string)
    const ryid = store?.userInfo?.ryid
    if (token && ryid && config.headers) {
      config.headers['gd-token'] = token || ''
      config.headers.userId = ryid || ''
    }
    return config
  },
  (error: AxiosError) => {
    Promise.reject(error)
  },
)

// 不需要在请求返回后统一处理的URL
const EXCLUDE_URLS: Array<string> = [
  '/wjfw/xzwj',
  '/api/dagl/exportSjb',
  '/fpi/wjfw/upload',
  '/fpi/wjfw/download',
  '/api/wsjzgl/exportMlExcel',
  '/api/wsjzgl/createZzml',
  '/export/exportExcel',
]

const SPECIAL_URLS: Array<string> = [
  '/api/gdgl/createStclgdjjd',
  '/api/gdgl/getAjerwm',
  '/api/gdgl/createJsstgdjjd',
  '/api/gdgl/getJzsmjsjjd',
  '/api/wsjzgl/getZzml',
  '/api/wsjzgl/createZzml',
  '/api/wsjzgl/saveZzml',
  '/api/wsjzgl/downTyywwj',
  '/api/jygl/downAjZip',
  '/api/gdjd/downloadJdbb',
  '/api/jdgl/createGdjdtzs',
]

// 响应拦截器
instance.interceptors.response.use(
  // 请求成功
  (res: AxiosResponse) => {
    if (
      (res.config.url &&
        (SPECIAL_URLS.indexOf(res.config.url) >= 0 ||
          res.config.url?.includes('/api/wsjzgl/downTyywwj') ||
          res.config.url?.includes('/api/gdgl/getAjgddjb?gddjbxh'))) ||
      res.config.url?.includes('/api/gdgl/getSmcljjd?smcljjdxh') ||
      res.config.url?.includes('/api/gdgl/getTgspb?gdjlbh') ||
      res.config.url?.includes('/api/jygl/getJydwj?jysqbh')
    ) {
      return Promise.resolve(res)
    }
    // 请求结果不做处理，直接返回
    if (res.config.url && EXCLUDE_URLS.indexOf(res.config.url) >= 0) {
      return Promise.resolve(res.data)
    }
    if (res.data.code === 0 || res.data.code === 200) {
      if (res.data.data && res.data.data.token) {
        // 缓存令牌信息
        window.sessionStorage.setItem('token', res.data.data.token)
        // 清空令牌信息
        res.data.data.token = ''
      }
      return Promise.resolve(res.data)
    } else {
      if (res.data.code === 20114) {
        ElMessage({
          type: 'error',
          message: res.data.message + ',请重新登录',
        })
        setTimeout(() => {
          window.location.href = window.HOMEIP
        }, 1500)
      }
      // 服务端返回异常
      console.log('请求失败:', res.data.code, res.config.baseURL, res.config.url)
      console.log('返回值', res.data)
      const errMsg = HTTP_STATUS[`CODE_${res.data.code === -1 ? '_1' : res.data.code}`]
        ? HTTP_STATUS[`CODE_${res.data.code === -1 ? '_1' : res.data.code}`].msg
        : ''
      /*
        当msg存在说明此错误在这已经处理
        msg没值的错误需要功能处自行判断处理方式
         */
      if (errMsg) {
        processError(
          res.data.code,
          HTTP_STATUS[`CODE_${res.data.code === -1 ? '_1' : res.data.code}`],
        )
      }
      // eslint-disable-next-line prefer-promise-reject-errors
      return Promise.reject({
        code: res.data.code,
        isError: !!errMsg && !!res.data.message,
        message: res.data.message,
      })
    }
  },
  // 请求失败
  (error: AxiosError) => {
    // 连接服务失败
    if (error.message === 'Network Error') {
      const obj: any = {
        isError: false,
        code: '',
        message: '连接服务失败！',
      }
      return Promise.reject(obj)
    }
    // 请求超时
    // const status = (error.response && error.response.status && error.response.status) || ''
    // const errMsg = status ? HTTP_STATUS['CODE_' + status].msg : `连接出错(${error.code})`
    // eslint-disable-next-line prefer-promise-reject-errors
    return Promise.reject({
      isError: false,
      code: error.response ? error.response.status : '',
      message: (error.response as any).data.message,
    })
  },
)
interface errorMessage {
  msg: string
  handler: string
  type?: string
}
/*
  对接口错误处理
  区分业务和功能
  业务错误在具体代码中处理
  功能性错误直接处理
 */
function processError(code: number, error: errorMessage) {
  switch (error.handler) {
    case 'message':
      ElMessage({
        type: error.type === 'warning' ? 'warning' : 'error',
        message: error.msg,
      })
      break
    case 'toLogin':
      // eslint-disable-next-line no-case-declarations
      const dom = document.getElementsByClassName('el-overlay-message-box')
      if (dom && dom.length > 0) {
        return
      }
      ElMessageBox.confirm(error.msg, '警告', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
      }).then(() => {
        // 跳回登录
        router.push('/')
      })
      break
    default:
      break
  }
}
const HTTP_STATUS: any = {
  CODE__1: {
    msg: '程序运行发生异常，请联系管理员',
    handler: 'message',
  },
  CODE_400: {
    msg: '请求错误(400)，请联系管理员',
    handler: 'message',
  },
  CODE_401: {
    msg: '未授权，请重新登录(401)，请联系管理员',
    handler: 'toLogin',
  },
  CODE_403: {
    msg: '拒绝访问(403)，请联系管理员',
    handler: 'message',
  },
  CODE_404: {
    msg: '未找到(404)，请联系管理员',
    handler: 'message',
  },
  CODE_408: {
    msg: '请求超时(408)，请联系管理员',
    handler: 'message',
  },
  CODE_500: {
    msg: '服务器错误(500)，请联系管理员',
    handler: 'message',
  },
  CODE_501: {
    msg: '服务未实现(501)，请联系管理员',
    handler: 'message',
  },
  CODE_502: {
    msg: '网络错误(502)，请联系管理员',
    handler: 'message',
  },
  CODE_503: {
    msg: '服务不可用(503)，请联系管理员',
    handler: 'message',
  },
  CODE_504: {
    msg: '网络超时(504)，请联系管理员',
    handler: 'message',
  },
  CODE_505: {
    msg: 'HTTP版本不受支持(505)，请联系管理员',
    handler: 'message',
  },
  CODE_10000: {
    msg: '未登录，请先登录',
    handler: 'toLogin',
  },
  CODE_10001: {
    msg: '签名验证失败，请联系管理员',
    handler: 'message',
  },
  CODE_10002: {
    msg: '访问口令过期，请重新登录',
    handler: 'toLogin',
  },
  CODE_10003: {
    msg: '参数无效，请重新输入',
    handler: 'message',
    type: 'warning',
  },
  CODE_10004: {
    msg: '已登录，请勿重复登录',
    handler: 'message',
  },
  CODE_10005: {
    msg: '访问口令过期，请重新登录',
    handler: 'toLogin',
  },
  CODE_10006: {
    msg: '无资源访问权限，请联系管理员',
    handler: 'message',
  },
  CODE_10007: {
    msg: '缺少必要的签证参数',
    handler: 'message',
  },
  CODE_10008: {
    msg: '无效的请求，URL不存在',
    handler: 'message',
  },
  CODE_99998: {
    msg: '请求取消后报的异常，无需处理',
    handler: '',
  },
  CODE_99999: {
    msg: '返回参数无效，请联系管理员',
    handler: 'message',
  },
  CODE_20114: {
    msg: '访问口令过期，请重新登录',
    handler: 'message',
  },
}

export default instance
